{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.optimize import newton"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio: Derivada numérica de funciones\n",
    "Programar la función derivNum(fun, x0, h), a la que se le pasa una función `fun` (de una variable), un punto `x0` y un spread `h`, y devuelve la derivada numérica de la función en ese punto con ese spread.\n",
    "\n",
    "Es decir, el valor de la aproximación\n",
    "$$f'(x_0) \\simeq \\frac{f(x_0+h) - f(x_0-h)}{2h}$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def derivNum(fun, x0, h=1E-6):\n",
    "    return (fun(x0 + h) - fun(x0 - h) ) / (2*h)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vamos a usarla para obtener derivadas numéricas de una función no trivial de la que conozcamos su derivada. Por ejemplo, la función seno, cuya derivada es el coseno."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x0 = 1.23657\n",
    "derApr = derivNum(np.sin, x0)\n",
    "derExacta = np.cos(x0)\n",
    "print(\"El valor exacto es %0.14f\" % derExacta)\n",
    "print(\"El valor estimado es %0.14f\" % derApr)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Ahora buscamos lo pedido: una aproximación de $\\sqrt{5}$. Lo que distingue a $\\sqrt{5}$ es que es un $x$ tal que $x^2=5$. O, de otro modo, un cero de la función $f(x) = x^2 - 5$. Usamos la función `hallaCero`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fun(x):\n",
    "    return x*x - 5\n",
    "\n",
    "raiz5Aprox = newton(func=fun, x0=0.0, tol=1E-12)\n",
    "print(\"El valor real es %0.15f\" % np.sqrt(5))\n",
    "print(\"El valor aprox es %0.15f\" % raiz5Aprox)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
